package com.xuzimian.globaldemo.designpatterns.singleton;

/**
 * 静态内部类模式：
 * 当StaticSingleton被加载时，其内部类并不会被初始化，故可以确保当StaticSingleton类被载入JVM
 * 时，不会初始化单例类，而当getInstance()方法被调用时，才会加载SingletonHolder,从而初始化
 * instance。同时，由于实例的建立是在类加载时完成的，而类加载多线程安全的，因此getInstance()
 * 不需要同步关键字。
 * 注意：此种模式实现的单例，仍有例外的情况，可能导致系统生成多个实例，比如在代码中，通过反射
 * 机制，强行调用单例类的私有构造函数，生成多个单例。
 */
public class StaticSingleton {

    private StaticSingleton() {
        System.out.println("StaticSingleton is create");
    }

    private static class SingletonHolder {
        private static StaticSingleton instance = new StaticSingleton();
    }

    public static StaticSingleton getInstance() {
        return SingletonHolder.instance;
    }

    public static void createString() {
        System.out.println("createString in Singleton");
    }
}
